/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.wooxes.server;

import java.io.*;
import java.net.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 *
 * @author alladanosa
 */
public class CrearActivitatServlet extends HttpServlet {
   
    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
    * @param request servlet request
    * @param response servlet response
    */

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        // S'inicialitza la sortida per poder mostrar resposta
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        // Mirem si es multipart
        if(!ServletFileUpload.isMultipartContent(request)){
            return;
        }
        
        // Ara obtindrem valors de configuracio
        ConnexioSQL connexio = new ConnexioSQL();
        Connection conn = connexio.getConnection();
        ConfiguracioServidor config = new ConfiguracioServidor(conn);
        
        // Comencem el servlet
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setFileSizeMax(config.getMaxFileSize());

        List items = null;
        try {
            items = upload.parseRequest(request);
        }
        catch(FileUploadException e){
            System.out.println(e);
            out.println(e.toString());
            return;
        }

        // S'obté el pròxim identificador d'activitat
        int idactivitat = 0;
        try{
            Statement statement = conn.createStatement();

            ResultSet rs = statement.executeQuery("SELECT last_value FROM activitat_id_seq");
            if(rs.next()){
                idactivitat = rs.getInt("last_value");
                idactivitat++;
            }
            rs = null;
        }
        catch (Exception e){
            out.println("Error: No s'ha pogut obtenir l'identificador de l'activitat");
            return;
        }
        // Aqui es processen els diferents camps del formulari.
        int idassignatura = 0;
        String nom = "";
        String data = "";
        String hora = "";
        String descripcio = "";

        for (Iterator i = items.iterator(); i.hasNext();) {
            FileItem item = (FileItem) i.next();
            
            if(item.isFormField()){
                if(item.getFieldName().equals("id")){
                    // Aquí obtenim l'identificador de la assignatura (ID)
                    idassignatura = Integer.parseInt(item.getString());
                }
                else if(item.getFieldName().equals("nom")){
                    nom = item.getString("UTF-8");
                }
                else if(item.getFieldName().equals("data")){
                    data = item.getString("UTF-8");
                }
                else if(item.getFieldName().equals("hora")){
                    hora = item.getString("UTF-8");
                }
                else if(item.getFieldName().equals("descripcio")){
                    descripcio = item.getString("UTF-8");
                }
                continue;
            }
            
            String fileName = obtenirNomArxiu(item.getName());      // Obtenim nom d'arxiu
            // booleà per controlar si s'ha d'esborrar l'arxiu en cas d'error
            boolean eliminar_arxiu = false;
            String ruta="";

            if((item.getSize() != 0) && (!fileName.equals(""))){
                System.out.println(fileName);
                ruta = config.getUploadDir();                    // Obtenim directori desti

                // Creació de la ruta (directori) destí
                ruta = ruta + idactivitat + File.separator;
                File uploaddir = new File(ruta);

                File uploadedFile = new File(ruta+fileName);
                if(!crearDirectori(uploaddir)){
                    out.println("Error: No es pot crear el directori desti: " + uploaddir.toString());
                    return;
                }
                try{
                    if(uploadedFile.exists() && uploadedFile.isFile()){
                        out.println("Error: Arxiu ja existent");
                        return;
                    }
                    item.write(uploadedFile);                           // S'escriu l'arxiu en el disc dur
                    eliminar_arxiu = true;
                }
                catch (Exception e) {
                    if(!DeleteFile.deleteDirectory(ruta)){
                        System.out.println("No s'ha pogut borrar el fitxer: "+ruta);
                    }
                    out.println("No s'ha pogut guardar l'arxiu");
                    return;
                }
            }
            
            // Grabar entrega a la bd;
            if(actualitzarBD(conn, idassignatura, nom, data, hora, descripcio, fileName)==0){
                if(eliminar_arxiu == true){
                    if(!DeleteFile.deleteDirectory(ruta)){
                        System.out.println("No s'ha pogut borrar el fitxer: "+ruta);
                    }
                }

                // Si no s'ha pogut insertar la nova entrega, borrar arxiu ¿?
                out.println("Error: No s'ha pogut actualitzar la BD");
                return;
            }
        }
        out.println("ok");
        out.close();
    }
    
    private int actualitzarBD(Connection conn, int idassignatura, String nom, String data, String hora, String descripcio, String arxiu){
        try{
            Statement statement = conn.createStatement();
            
            /*
            SimpleDateFormat format1 = new SimpleDateFormat("dd-MM-yyyy");
            java.util.Date date = format1.parse(data);
            
            SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");
            String fdata = format2.format(date);
            */
            
            int i = statement.executeUpdate(
                    "INSERT INTO activitat (idassignatura, nom, data, hora, descripcio, adjunt) values (" +
                    "'" + idassignatura + "', " +
                    "'" + nom + "', " +
                    "'" + data + "', " +
                    "'" + hora + "', " +
                    "'" + descripcio + "', " +
                    "'" + arxiu + "'" +
                    ")");
            return i;
        }
        catch(Exception e){
            System.out.println(e);
            return 0;
        }
    }

    private boolean crearDirectori(File directori){
        boolean bool = directori.exists();
        if(bool){
            // Comprovem si el que existeix es un directori
            bool = directori.isDirectory();
        }
        if (bool != true){
            bool=directori.mkdir();
        }
        System.out.println("Creant directori: " + directori.toString() + " -> " + bool);
        return bool;
    }
    
    private String obtenirNomArxiu(String fileName){
        int slash = fileName.lastIndexOf("/");      // Si es tracta d'un usuari Linux
        if (slash == -1) {
            slash = fileName.lastIndexOf("\\");     // Si es tracta d'un usuari Windows
        }
        if (slash != -1) {
            fileName = fileName.substring(slash +1 );
        }
        return fileName;
    }
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
    * Handles the HTTP <code>GET</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
    * Handles the HTTP <code>POST</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
    * Returns a short description of the servlet.
    */
    public String getServletInfo() {
        return "Short description";
    }
    // </editor-fold>
}
